package information;

import util.Coordinaat;
import util.WindRichting;

public class Vakje {

	private Kaart kaart;
	
	/**
	 * Maakt een nieuw vakje aan.
	 */
	public Vakje(Coordinaat coordinaat, Kaart kaart) {
		
		this.kaart = kaart;
		this.coordinaat = coordinaat;
		this.grenzen = new VakGrens[4];
		
		for(WindRichting windrichting: WindRichting.values())
			maakGrens(windrichting);
		
	}

	/**
	 * Gaat bij de buur in de windrichting kijken, en neemt de overeenkomstige vakgrens over.
	 * Als er geen buur is maakt deze methode een nieuw vakgrens aan.
	 */
	private void maakGrens(WindRichting windrichting)
	{
		Vakje vakjeInWindrichting = kaart.getRauwVakjeOp(coordinaat.plus(windrichting.getVector()));
		if(vakjeInWindrichting == null)
		{
			grenzen[windrichting.ordinal()] = new VakGrens();
			return;
		}
		
		grenzen[windrichting.ordinal()] = vakjeInWindrichting.getVakGrens(windrichting.getTegengesteld());
	}
	
	public Coordinaat getCoordinaat() {
		return coordinaat;
	}
	
	private final Coordinaat coordinaat;
	
	/**
	 * Geeft de buur van dit vakje terug. Als die buur niet
	 * bestaat wordt die aangemaakt.
	 * 
	 * @return	return != null
	 */
	public Vakje getBuur(WindRichting w) {
		return kaart.getVakjeOp(getCoordinaat().plus(w.getVector()));
	}
	
	/**
	 * Geeft de buur van dit vakje terug. Als die buur niet
	 * bestaat wordt null teruggegeven.
	 * 
	 * @return	return == null || return != null
	 */
	public Vakje getRouweBuur(WindRichting w) {
		return kaart.getRauwVakjeOp(getCoordinaat().plus(w.getVector()));
	}
	
	public VakGrens getVakGrens(WindRichting w) {
		return this.grenzen[w.ordinal()];
	}
	
	private VakGrens[] grenzen;
	
	public boolean isVolledigGekend()
	{
		for(VakGrens grens : grenzen)
			if(!grens.isGekend())
				return false;
		return true;
	}
}
